/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dwh.trigger;

import org.apache.commons.cli.Option;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
import static org.dwh.trigger.Out.*;
import static org.dwh.trigger.Configure.*;

/**
 * Clase principal del programa.
 * @author Jose Carlos Palma
 * @version v1.0.0
 */
public class Main {

    /**
     * Almacena el nombre del archivo de configuración, por defecto es "trigger.conf".
     */
    public static String conf = "trigger.conf";

    /**
     * Método principal del programa.
     * @param args Los argumentos de linea de comando
     */
    public static void main(String[] args) {
        
        commandLine(args);

        loadConfig(Main.conf);

        String serverName = getString("server.name");
        int serverPort = getInt("server.port");

        final ServerSocket server = new ServerSocket(serverName, serverPort);

        Runtime.getRuntime().addShutdownHook(new Thread() {

            @Override
            public void run() {
                info("Bajando el ServerSocket...");
                if (server != null) {
                    server.halt();
                    while (!server.isShutDown()) {
                        try {
                            sleep(500);
                        } catch (InterruptedException ex) {
                        }
                    }
                }
                info("ServerSocket detenido");
            }
        });

        server.start();

    }

    public static void loadConfig(String conf) {
        Main.conf = conf;
        info("Cargando archivo de configuracion \"" + Main.conf + "\"...");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(conf);
        } catch (FileNotFoundException ex) {
            error("No se encontro el archivo de configuracion, " + ex.getMessage());
            //Si el archivo de configuracion por defecto es el que no existe, termina
            //el programa.
            if (Main.conf.equals("trigger.conf")) {
                Runtime.getRuntime().exit(1);
            }
            info("Cargando archivo de configuracion por defecto \"trigger.conf\"...");
            Main.conf = "trigger.conf";

            try {
                fis = new FileInputStream(Main.conf);
            } catch (FileNotFoundException fnfe) {
                error("No se encotro el archivo de configuracion por defecto, " + fnfe.getMessage());
                Runtime.getRuntime().exit(1);
            }
        }
        try {
            System.getProperties().load(fis);

        } catch (IOException ex) {
            error("No se pudo cargar el archivo de configuracion, " + ex.getMessage());
            Runtime.getRuntime().exit(1);
        }
        info("Archivo de configuracion \"" + Main.conf + "\" [OK]");


        //System.getProperties().list(System.out);
        
    }


    public static void commandLine(String[] args){
        
        CommandLineParser clp = new PosixParser();
        HelpFormatter hf = new HelpFormatter();
        hf.setWidth(80);
        Options opts = new Options();

        //
        opts.addOption("h", "help", false, "Muestra la ayuda.");

        //Opcion para el archivo de configuracion
        Option op = new Option("f", true, "Nombre del archivo de configuracion.");
        op.setArgName("configFile");
        opts.addOption(op);
        try {
            CommandLine cl = clp.parse(opts, args);

            if( cl.hasOption("h") ){
                hf.printHelp("JTrigger.jar ", opts);
                System.exit(0);
            }

            if( cl.hasOption("f") ){
                Main.conf = cl.getOptionValue("f").trim();
            }

        } catch (ParseException ex) {
            error("Argumentos invalidos, " + ex.getMessage());
            Runtime.getRuntime().exit(1);
        }

    }
}
